import axios from 'axios'
import type { AxiosInstance, InternalAxiosRequestConfig, AxiosResponse } from 'axios'
import { ElMessage } from 'element-plus'
import { useCounterStore } from '@/stores/counter'

// 创建 axios 实例
const createAxiosInstance = (baseURL: string): AxiosInstance => {
  const instance = axios.create({
    baseURL,
    timeout: 10000,
    // headers: {
    //   'Content-Type': 'application/json',
    // },
  })

  // 请求拦截器
  instance.interceptors.request.use(
    (config: InternalAxiosRequestConfig) => {
      const counter = useCounterStore()
      // 从 sessionStorage 获取 token
      const token = sessionStorage.getItem('token') || counter.UserInfo.Token
      
      // 如果有token，添加到请求头
      if (token) {
        // 确保 headers 对象存在
        config.headers = config.headers || {}
        // 添加 Bearer token
        config.headers.Authorization = `Bearer ${token}`
        console.log('Request with token:', config.headers.Authorization)
      }
      return config
    },
    (error) => {
      console.error('请求拦截器出错:', error)
      return Promise.reject(error)
    }
  )

  // 响应拦截器
  instance.interceptors.response.use(
    (response: AxiosResponse) => {
      const { data } = response
      
      if(response.config.responseType === 'blob'){
        return response
      }

      // 处理业务状态码
      if (data.code === 200) {
        // 如果响应中包含 token，保存到 sessionStorage
        if (data.data?.Token) {
          sessionStorage.setItem('token', data.data.Token)
        }
        return data // 业务成功，返回原始data
      }
      
      // 对于业务错误码（后端返回状态码200但业务code非200），直接返回data，由业务代码处理
      if (response.status === 200 && data.code !== 200) {
          return data; 
      }
      
      // 默认情况下，reject 整个响应对象或错误
      return Promise.reject(response);
    },
    (error) => {
      // 处理 HTTP 错误 (非 2xx 状态码)
      if (error.response) {
        switch (error.response.status) {
          case 401:
            ElMessage.error('登录已过期，请重新登录')
            // 清除 token
            const counter = useCounterStore()
            counter.UserInfo.Token = ''
            counter.UserInfo.UserId = 0
            counter.UserInfo.NickName = ''
            // 清除 sessionStorage 中的 token
            sessionStorage.removeItem('token')
            break
          case 403:
            ElMessage.error('没有权限访问')
            break
          case 404:
            ElMessage.error('请求的资源不存在')
            break
          case 500:
            ElMessage.error('服务器内部错误') // 更明确提示是服务器错误
            break
          default:
            ElMessage.error('网络错误或未知HTTP错误: ' + (error.response.statusText || error.message || ''))
        }
         // 始终 reject 带有响应的错误对象，以便调用者可以进一步处理（如果需要）
        return Promise.reject(error);
      } else if (error.request) {
        // 请求已发送但没有收到响应
        ElMessage.error('网络连接失败，请检查网络')
         return Promise.reject(error);
      } else {
        // 在设置请求时触发的错误
        ElMessage.error('请求配置错误: ' + error.message)
         return Promise.reject(error);
      }
    }
  )

  return instance
}

// 创建读写 API 实例
const ReadAPI = createAxiosInstance('http://localhost:5161')
const WriteAPI = createAxiosInstance('http://localhost:5293')

//导出axios实例
export default ReadAPI
export { WriteAPI } 